﻿package org.asclub.effect {
    
    /**
            
    Written by:
    Dustin Andrew
    dustin@flash-dev.com
    www.flash-dev.com
    
    LAST UPDATED:
    01/24/06
    
    Reflection.as
    
    创建位图的倒影
    
    Create a bitmap reflection of a displayobject    
	
	
            
    */
			
	/**
	 * @example
	 * <code>
	 * 		public function ReflectionTest() 
	 * 		{
				// Setup stage
				this.stage.align = StageAlign.TOP_LEFT;
				this.stage.scaleMode = StageScaleMode.NO_SCALE;
				
				// Load image
				var loadImg:Loader = new Loader();
				loadImg.contentLoaderInfo.addEventListener(Event.COMPLETE, onImgLoaded);
				loadImg.load(new URLRequest("image.jpg"));
			}
			
			// Called when image is loaded
			private function onImgLoaded(event:Event):void {
				
				var sprImg:Sprite = new Sprite();
				
				// Attach image
				var disImg:DisplayObject = event.target.content;
				var filGlow:GlowFilter = new GlowFilter(0x000000, .3, 8, 8, 1, 3, false, false);
				disImg.filters = [filGlow];
				sprImg.addChild(disImg);
				
				// Add reflection
				var sprReflect:Reflection = new Reflection(disImg, .4, .2, 0, 0, 1);
				sprImg.addChild(sprReflect);            
				
				// Center
				sprImg.x = (this.stage.stageWidth - sprImg.width) / 2;
				sprImg.y = (this.stage.stageHeight - sprImg.height) / 2;
				
				this.addChild(sprImg);
			}
	 * </code>
	*/
			
	import flash.display.BlendMode;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
    import flash.display.GradientType;
    import flash.display.Shape;
    import flash.display.Sprite;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
    import flash.events.Event;

    public class Reflection extends Sprite {
        
        private var _disTarget:DisplayObject;
        private var _numStartFade:Number = .3;
        private var _numMidLoc:Number = .5;
        private var _numEndFade:Number = 0;
        private var _numSkewX:Number = 0;
        private var _numScale:Number = 1;        
        private var _bmpReflect:Bitmap;
        
        // Constructor
        public function Reflection(set_disTarget:DisplayObject, set_numStartFade:Number, set_numMidLoc:Number, set_numEndFade:Number, set_numSkewX:Number, set_numScale:Number) {
            super()
            _disTarget = set_disTarget;
            _numStartFade = set_numStartFade;
            _numMidLoc = set_numMidLoc;
            _numEndFade = set_numEndFade;
            _numSkewX = set_numSkewX;
            _numScale = set_numScale;
            
            _bmpReflect = new Bitmap(new BitmapData(1, 1, true, 0));
            this.addChild(_bmpReflect);
            createReflection();
        }
        
        // Create reflection
        private function createReflection(event:Event = null):void {
            
            // Reflection
            var bmpDraw:BitmapData = new BitmapData(_disTarget.width, _disTarget.height, true, 0);
            var matSkew:Matrix = new Matrix(1, 0, _numSkewX, -1 * _numScale, 0, _disTarget.height);
            var recDraw:Rectangle = new Rectangle(0, 0, _disTarget.width, _disTarget.height * (2 - _numScale));
            var potSkew:Point = matSkew.transformPoint(new Point(0, _disTarget.height));
            matSkew.tx = potSkew.x * -1;
            matSkew.ty = (potSkew.y - _disTarget.height) * -1;
            bmpDraw.draw(_disTarget, matSkew, null, null, recDraw, true);
            
            // Fade
            var shpDraw:Shape = new Shape();
            var matGrad:Matrix = new Matrix();
            var arrAlpha:Array = new Array(_numStartFade, (_numStartFade - _numEndFade) / 2, _numEndFade);
            var arrMatrix:Array = new Array(0, 0xFF * _numMidLoc, 0xFF);
            matGrad.createGradientBox(_disTarget.width, _disTarget.height, 0.5 * Math.PI);
            shpDraw.graphics.beginGradientFill(GradientType.LINEAR, new Array(0,0,0), arrAlpha, arrMatrix, matGrad)
            shpDraw.graphics.drawRect(0, 0, _disTarget.width, _disTarget.height);
            shpDraw.graphics.endFill();
            bmpDraw.draw(shpDraw, null, null, BlendMode.ALPHA);
            
            _bmpReflect.bitmapData.dispose();
            _bmpReflect.bitmapData = bmpDraw;
            
            _bmpReflect.filters = _disTarget.filters;
            
            this.x = _disTarget.x;
            this.y = (_disTarget.y + _disTarget.height) - 1;          
        }
    }//end of class
}